package com.example.scheduling.demo;

import org.springframework.scheduling.annotation.Async;

public class AsyncDemo {
    // 您可以使用@Async注解将方法标记为异步方法，允许该方法在调用时不会阻塞主线程，而是在后台线程中执行。
    // 异步方法不会自动执行。它们需要通过显式的调用来触发。也就是说，你需要在代码中的某个地方直接或间接地调用这个方法，它才会被执行。
    // 适用于那些你希望以非阻塞方式执行的任务，例如发送邮件、处理文件上传等耗时操作。
    // 默认情况下，异步方法不在事务上下文中运行。如果你需要事务支持，可以考虑使用 Propagation.REQUIRES_NEW 或者手动管理事务。

    // 您可以在方法上提供 @Async 注解，以便异步调用该方法。换句话说，调用者在调用后立即返回，而方法的实际执行发生在已提交到 Spring TaskExecutor 的任务中。
    @Async
    void doSomething() {
        // 异步执行的任务逻辑
        System.out.println("Executing async task...");
    }

    // 与使用@Scheduled注解的方法不同，这些方法可以接收参数，因为它们是在运行时由调用方以“正常”方式调用，而不是由容器管理的计划任务调用。
    @Async
    void doSomething1(String data) {
        // 异步执行的任务逻辑
        System.out.println("Executing async task...");
    }

}


// 当@Async方法具有Future类型的返回值时，很容易管理在方法执行期间抛出的异常，因为此异常是在调用Future结果上的get时抛出的。但是，对于void返回类型，异常未被捕获，也无法传递。您可以提供AsyncUncaughtExceptionHandler来处理此类异常。